/**
 * Created by Administrator on 2016/12/19.
 */
/*
* 必须传入参数:
*  url(支持json) ,
*  可选参数:
*  urlParams
*
*
*
*
* */
//目前已全局保存参数
//多选的id  $rootScope.select_list_index
//所获取的当前数据  $rootScope.pageData
//点击当前的行的id $rootScope.select_list_info

myApp.controller("REPORT", function ($rootScope, $scope, $http, $filter, $interval, $q,httpService,commonUtil) {
	this.select_list = [];
	//选中列表的IDs
	//是否存在checkBox
	$scope.checkBox = '';
	$scope.dataUrl = '';
	//定义checkBox变量为false;
	$scope.checkBoxAll = false;
	//获取的列表数据;
	$scope.pageData = [];
	//数据分发
	$scope.broadcast_data=function(_data) {
		var title=[];
		var main = [];
		angular.forEach($scope.column,function (i1,index) {
			//将头部数据放入title;
			title.push(i1.label);
			//将内容文字放入对应字段
			main = [];
			angular.forEach(_data,function (item,index) {
				i1.value = item[i1.prop];
				$scope.std.map(function(it){
					i1[it] = item[it];
				});
				main.push(JSON.parse(JSON.stringify(i1)));
			});
			$scope.$broadcast(i1.prop,main);
		});
		//往头部发送信息;确定table头部
		$scope.$broadcast('report_header',{data:title});
		if($scope.checkBox=="true"){
			$scope.$broadcast('column_check',{data:main});
		}
	}
	/*选中所有checkBox*/
	this.checkAll=function(){
		$scope.checkBoxAll =!$scope.checkBoxAll;
		$rootScope.select_list_index.length = 0;
		if($scope.checkBoxAll){
			angular.forEach($scope.pageData,function (item,idx) {
				$rootScope.select_list_index.push(item.id);
			})
		}
	};
	//选中当前行,并获取ID放入select_list;
	this.selectRow=function (item,idx) {
		$rootScope.select_list_info = item;
		$scope.checkBoxAll = false;
		itemIndex = this.select_list.indexOf(item.id);
		if(itemIndex>=0){
			this.select_list.splice(itemIndex,1);
		}else{
			this.select_list.push(item.id)
		}
		console.log($rootScope.select_list_index)
	}
	//选取当前ID,并将数据详情保存到root
	
	$scope.loadData = function (url,par) {
		httpService.getRequest(url,par).then(function(result){
			$rootScope.select_list_index.length = 0;
			$scope.pageConfig.totalResult =  result.data.totalResult;
			$rootScope.pageData = result.data.data;
			$scope.pageData = result.data.data;
			$scope.pageData.map(function(item,index){
				item.buyTime = commonUtil.substringDate(item.buyTime);
			});
			//附带保存字段的字段名称
			$scope.broadcast_data($scope.pageData,$scope.storeData);
		});
	};
	
	
	$scope.pageConfig={
		"currentPage":1,
		"showCount":5,
		"totalResult":""
	};
	$scope.changePage = function () {
		$scope.loadData($scope.dataUrl,$scope.pageConfig)
	};
	
	
	
});

myApp.directive('report', function ($rootScope,httpService,commonUtil,$http) {
	var obj = {
		//指令在DOM中以什么形式声明; "E"=元素,"A"=属性,"C"=class,"M"=注释 默认为"A"
		restrict: "EA",
		//执行的优先级
		priority: 0,
		//true=优先级低于此指令的不生效 false=均生效
		terminal: false,
		//代表所链接HTML文件的字符串地址,也可以是跟template一样的函数
		//templateUrl: 'module/report.html', //获取为其本身,固不需要配置url地址
		templateUrl:'model/report/report.html',
		//true=显示原始标签,false=不显示原始标签
		replace: false,
		//false=继承父作用域,
		//true=表示继承父作用域，并创建自己的作用域（子作用域）,
		// {}=表示创建一个全新的隔离作用域,
		// 内部属性
		// "@" 绑定一个局部 scope 属性到当前 dom 节点的属性值 (单向绑定,向内影响)
		// "=" 通过 directive 的 attr 属性的值在局部 scope 的属性和父 scope 属性名之间建立双向绑定 (双向绑定,同时影响)
		// "&"  提供一种方式执行一个表达式在父 scope 的上下文中。如果没有指定 attr 名称，则属性名称为相同的本地名称(绑定事件,事件改变是可以是directive外的改变,内往外传)
		scope: {
			dataUrl: '@url',	//url地址
			params: '@', //charts的url所需要的参数
			user:'=',  //绑定参数
			click:'&', //绑定方法
			checkBox:'@checkBox'
		},
		//可以是字符串或者函数 (公共逻辑)
		//字符串可以指定控制器名称
		//函数为自己设定控制器逻辑
		controller: "REPORT",
		transclude:true,
		compile : function (scope, Element) {
			return {
				pre: function preLink(scope, element, attr,ctl) {
					$rootScope.select_list_index = ctl.select_list;
					scope.checkAll = ctl.checkAll;
					scope.storeData = attr.storeData;
					scope.pageConfig = JSON.parse(attr.params);
					scope.loadData(attr.url,scope.pageConfig);
				},
				post: function postLink(scope, element, attributes) {
					var u,allNum=0,width,align,itemIndex;
					scope.std = attributes.storeData.split(',');
					scope.column = [];
					//获取子集列的各项参数;
					angular.forEach(element[0].children,function (e,index) {
						if(e.className=='as-report-main'){
							angular.forEach(e.children,function (ev,index) {
								if(ev.className == 'as-report-scroll'){
									angular.forEach(ev.children,function (eve,i) {
										if(
											eve.nodeName != 'COLUMN-CHECK'
										){
											itemIndex = {};
											itemIndex.width = eve.attributes.width? eve.attributes.width.value : '10%';
											itemIndex.align = eve.attributes.align? eve.attributes.align.value : 'center';
											itemIndex.label = eve.attributes.label.value;
											itemIndex.prop = eve.attributes.prop.value;
											scope.std.map(function(item){
												itemIndex[item] = "";
											});
											scope.column.push(itemIndex);
											//放入自定义字段
											//配置并保存title的宽度,title宽度等量分割
											if(itemIndex.width.indexOf('%')>=0){
												u='%';
												allNum += itemIndex.width.split("%").join("")*1;
											}else if(itemIndex.width.indexOf('px')>=0){
												u='px';
												allNum += itemIndex.width.split("px").join("")*1;
											}
										}
									});
									//添加单位
									allNum+=attributes.checkBox =='true' ? 5 : 0;
									scope.allWidth = allNum + u ;
									return ;
								}
							});
							return ;
						}
					});
				}
			};
		},
	};
	return obj;
});

myApp.directive('column', function () {
	var obj = {
		//指令在DOM中以什么形式声明; "E"=元素,"A"=属性,"C"=class,"M"=注释 默认为"A"
		restrict: "EA",
		//执行的优先级
		priority: 0,
		//true=优先级低于此指令的不生效 false=均生效
		terminal: false,
		//代表所链接HTML文件的字符串地址,也可以是跟template一样的函数
		//templateUrl: 'module/report.html', //获取为其本身,固不需要配置url地址
		template:"<table style=\"width:100%;\">\n" +
		"    <colgroup>\n" +
		"        <col ng-repeat=\"t in main track by $index\" align=\"{{align}}\" width=\"100%\">\n" +
		"    </colgroup>\n" +
		"    <tbody>\n" +
		"        <tr  ng-repeat=\"t in main track by $index\" ng-click='selectRow(t,$index)' ng-class='select_list.indexOf(t.id)>=0? \"selectRow\" : \"\" '>\n" +
		"            <td class=\"transclude_box\" ng-click='clickEvent ? click(t) : \"\" ' ng-style='clickEvent? {\"text-decoration\":\"underline\",\"cursor\":\"pointer\",\"color\":\"#007eff\"} : {}'>\n" +
		"                {{t.value}}\n" +
		"                <span ng-transclude></span>\n" +
		"            </td>\n" +
		"        </tr>\n" +
		"    </tbody>\n" +
		"</table>",
		//true=显示原始标签,false=不显示原始标签
		replace: false,
		//false=继承父作用域,
		//true=表示继承父作用域，并创建自己的作用域（子作用域）,
		// {}=表示创建一个全新的隔离作用域,
		// 内部属性
		// "@" 绑定一个局部 scope 属性到当前 dom 节点的属性值 (单向绑定,向内影响)
		// "=" 通过 directive 的 attr 属性的值在局部 scope 的属性和父 scope 属性名之间建立双向绑定 (双向绑定,同时影响)
		// "&"  提供一种方式执行一个表达式在父 scope 的上下文中。如果没有指定 attr 名称，则属性名称为相同的本地名称(绑定事件,事件改变是可以是directive外的改变,内往外传)
		scope:{
			label:'@',
			align:'@',
			width:'@',
			prop:'@',
			clickEvent:'@',
		},
		//可以是字符串或者函数 (公共逻辑)
		//字符串可以指定控制器名称
		//函数为自己设定控制器逻辑
			controller: function ($rootScope, $scope, $http, $filter, $interval, $q, $timeout,$transclude,$element,$compile) {

			$scope.select_list = [];
			$scope.$on($scope.prop,function (event,d) {
				/*$timeout(function () {
					if($transclude().length>0){
						console.log($element);
						$transclude($scope,function (clone) {
							for(var i=0;i<clone.length;i++){
								if(clone[i].outerHTML){
									$element.find('.transclude_box').append($compile(clone)($scope));
									
								}
							}
						});
					}
				},1000)*/
				$scope.main = d;
			});
			$scope.click=function (t) {
				event.stopPropagation();
				$rootScope.select_list_info = t;
				$rootScope.$emit($scope.clickEvent,t);
			}
		},
		require:'?^report',
		transclude:true,
		link: function (scope, Element, Attrs,ctl) {
			Attrs.checkThis ? scope.checkThis = true : scope.checkThis = false;
			scope.selectRow = ctl.selectRow;
			scope.select_list = ctl.select_list;
			Element[0].style.width=Attrs.width ? Attrs.width : '10%';
			Element[0].style.float='left';
		}
	};
	return obj;
});


myApp.directive('columnCheck', function () {
	var obj = {
		//指令在DOM中以什么形式声明; "E"=元素,"A"=属性,"C"=class,"M"=注释 默认为"A"
		restrict: "EA",
		//执行的优先级
		priority: 0,
		//true=优先级低于此指令的不生效 false=均生效
		terminal: false,
		//代表所链接HTML文件的字符串地址,也可以是跟template一样的函数
		//templateUrl: 'module/report.html', //获取为其本身,固不需要配置url地址
		template:"<table style=\"width:100%;\">\n" +
		"    <colgroup>\n" +
		"        <col ng-repeat=\"t in main track by $index\" width=\"100%\">\n" +
		"    </colgroup>\n" +
		"    <tbody>\n" +
		"        <tr  ng-repeat=\"t in main track by $index\"  ng-class='select_list.indexOf(t.id)>=0? \"selectRow\" : \"\" ' ng-click='selectRow(t,$index)'>\n" +
		"            <td>\n" +
		"<input type='checkbox' ng-checked='select_list.indexOf(t.id)>=0? true : false' >" +
		"            </td>\n" +
		"        </tr>\n" +
		"    </tbody>\n" +
		"</table>",
		//true=显示原始标签,false=不显示原始标签
		replace: false,
		//false=继承父作用域,
		//true=表示继承父作用域，并创建自己的作用域（子作用域）,
		// {}=表示创建一个全新的隔离作用域,
		// 内部属性
		// "@" 绑定一个局部 scope 属性到当前 dom 节点的属性值 (单向绑定,向内影响)
		// "=" 通过 directive 的 attr 属性的值在局部 scope 的属性和父 scope 属性名之间建立双向绑定 (双向绑定,同时影响)
		// "&"  提供一种方式执行一个表达式在父 scope 的上下文中。如果没有指定 attr 名称，则属性名称为相同的本地名称(绑定事件,事件改变是可以是directive外的改变,内往外传)
		scope:{
			label:'@',
			align:'@',
			width:'@',
			prop:'@'
		},
		//可以是字符串或者函数 (公共逻辑)
		//字符串可以指定控制器名称
		//函数为自己设定控制器逻辑
		controller: function ($rootScope, $scope, $http, $filter, $interval, $q, $timeout) {
			$scope.select_list = [];
			$scope.main = [];
			//获取数据
			$scope.$on("column_check",function (event,d) {
				$scope.main = d.data;
			});
		},
		require:'?^report',
		transclude:true,
		link: function (scope, Element, Attrs,ctl) {
			scope.selectRow = ctl.selectRow;
			scope.select_list = ctl.select_list;
			Element[0].style.width=Attrs.width ? Attrs.width : '5%';
			Element[0].style.float='left';
			Element[0].style.textAlign = 'center';
		}
	};
	return obj;
});